<?php 

class Event_ProductPostSave extends Crud_Event_Handler 
{
	protected $_type = 'postSave';
	
	/**
	 * Run handler with options array.
	 * 
	 * @param OrdersRow $row
	 * @return void
	 */
	public function run($row)
	{
		$this->_setFinalCatgory($row);
		$this->_attributes($row);
		$this->_photo($row);
		$this->_alike($row);
		$this->_age($row);
		$this->_rank($row);
	}

	protected function _rank($row)
	{
		$priority = $row->getPriority();
		$hit = $row->getIsHit() == 1 ? 8 : 1;
		$new = $row->getIsNew() == 1 ? 6 : 1;
		$discout = $row->getIsDiscout() == 1 ? 0.2 : 1;
		$recommended = $row->getIsRecommended() == 1 ? 2 : 1;

		$dataRank = array('priority' => $priority,
						  'is_hit' => $hit, 'is_new' => $new,
						  'is_discout' => $discout,
						  'is_recommended' => $recommended);
		$i = 0;
		foreach($dataRank as $key => $value)
		{
			if($i == 0)
			{
				$i = $value;
			}else{
				$i = $i * $value;
			}
		}
		$count = $row->getCount();
		if($count > 0){
			$i = $i * 50;
		}
		$row->setRank($i);
		$row->save();
	}

	protected function _age($row){
		$age_from = trim($this->_getParam('age_from', ''));
		$age_to = $this->_getParam('age_to');
		if (!empty($age_to) && $age_from > $age_to) {
			throw new Crud_Exception('Невозможно выставить возраст от большего к меньшему');
		}

		if (empty($age_from) && strlen($age_from) == 1) {
			$row->setFromBorn(1);
		} else {
			$row->setFromBorn(0);
		}

		//die($age_from.' / '.$age_to);

		$row->setAgeFrom($age_from);

		$row->setAgeTo($age_to);
		$row->save();
		
	}
	
	/**
	 * Обрабатывает значения аттрибутов и заполняет таблицу product2attribute.
	 * 
	 * @param ProductRow $row
	 * @return void
	 */
	protected function _attributes($row)
	{
		$attributes = $this->_getParam('attribute');
		foreach (array('rules', 'certificate', 'instruction') as $key) {
			$oKey = $key;
			$key = 'file_' . $key;
			if (isset($_FILES[$key]) && $_FILES[$key]['name']) {
				$file = File::factory($key);
				$file->save();
				
				$attributes[$oKey] = $file->getDbValue();
			}
		}

		if ($this->_getParam('del_instruction')){
			$name_file = $this->_getParam('del_instruction', 0);
			$instruction = Product2productAttributePeer::getInstance();
			$prod_attr = ProductAttributePeer::getInstance();
			$sel = $prod_attr->select()->where('`key` = "instruction"');
			$res = $prod_attr->fetchRow($sel);
			$instruction->delete('`product_id` = "'.$row->getId().'" AND `attribute_id` = "'.$res['id'].'"');
			if($name_file != 0){
				$dir = BASE_DIR."/htdocs/upload/";
				unlink($dir.substr($name_file , 0 , 2)."/".$name_file);
			}
		}
		
		
		if (!$attributes) return;
		foreach ($attributes as $key => $value) {
			$attribute = ProductAttributePeer::getInstance()->fetchByKey($key);
			
			$p2aPeer = Product2productAttributePeer::getInstance();
			$select = $p2aPeer->select();
			$select->where(Product2productAttributePeer::PRODUCT_ID, $row->getId());
			$select->where(Product2productAttributePeer::ATTRIBUTE_ID, $attribute->getId());
			$p2a = $p2aPeer->fetchRow($select);
			if (!$p2a) {
				$p2a = $p2aPeer->createRow();
				$p2a->setAttributeId($attribute->getId());
				$p2a->setProductId($row->getId());
			}
			
			if ($value) {
				$p2a->setAttributeValue($value);
				$p2a->save();
			} else if ($p2a->getId()) {
				$p2a->delete();
			}
		}
	}
	
	/**
	 * Сохраняет загруженные фотографии к товару.
	 * 
	 * @param ProductRow $row
	 * @return void
	 */
	protected function _photo($row)
	{
		if (!$_FILES) return;
		foreach ($_FILES as $key => $value) {
			if (preg_match("/^photo\_[0-9]+/is", $key) && !$_FILES[$key]['error']) {
				$file = File::factory($key);
				$file->save();
				
				$photo = PhotoPeer::getInstance()->createRow();
				$photo->setName('');
				$photo->setUrl('');
				$photo->setFilePreview($file->getDbValue());
				$photo->save();
				
				$p2p = Product2photoPeer::getInstance()->createRow();
				$p2p->setProductId($row->getId());
				$p2p->setPhotoId($photo->getId());
				$p2p->save();
			}
		}
	}
	
	/**
	 * Сохраняет похожие и сопутствующие товары.
	 * 
	 * @param ProductRow $row
	 * @return void
	 */
	protected function _alike($row)
	{
		$this->_addAlike($row, 'alike');
		$this->_addAlike($row, 'attendant');
		$this->_addAttCat ($row);
	}

	protected function _addAttCat ($row){
		$atts = $this->_getParam('attendant_category', array());
		foreach ($atts as $att) {
			if (!$att) continue;
			$att = explode ("::" , $att);

			$peer = ProductCategoryPeer::getInstance();
			$select = $peer->select();
			$select->where(ProductCategoryPeer::ID, $att[1]);
			$rowset = $peer->fetchAll($select);
			if ($rowset->count() >= 2) {
				throw new Crud_Exception("Невозможно добавить сопуствущую категорию: `$att`. Категорий с таким именем несколько, пожалуйста, уточните запрос");
			}
			$alikeRow = $rowset->current();
			if (!$alikeRow) {
				throw new Crud_Exception("Невозможно добавить сопутствуюую категорию: `$att`. Категория с таким именем не найден");
			}

			$select = ProductAttendantCategoryPeer::getInstance()->select();
			$select->where('attendant_id = ?', $alikeRow->getId());
			$select->where('product_id = ?', $row->getId());
			$m2mRow = ProductAttendantCategoryPeer::getInstance()->fetchRow($select);
			if ($m2mRow) {
				throw new Crud_Exception("Невозможно добавить сопутствующую категорию: `$alikeRows[0]`. Наименование уже есть в списке");
			}

			$nRow = ProductAttendantCategoryPeer::getInstance()->createRow();
			$nRow->setAttendantId($alikeRow->getId());
			$nRow->setProductId($row->getId());
			$nRow->save();
		}
	}

	protected function _addAlike($row, $type)
	{
		if (!in_array($type, array('alike', 'attendant'))) return;
		
		$alikes = $this->_getParam($type, array());
		foreach ($alikes as $alike) {
			if (!$alike) continue;
			$alikeRows = explode('::', $alike);

			$peer = ProductPeer::getInstance();
			$select = $peer->select();
			$select->where(ProductPeer::INTERNAL_ID, $alikeRows[1]);
			$rowset = $peer->fetchAll($select);
			if ($rowset->count() >= 2) {
				throw new Crud_Exception("Невозможно добавить сопуствующий товар: `$alike`. Товаров с таким именем несколько, пожалуйста, уточните запрос");
			}
			
			$alikeRow = $rowset->current();
			if (!$alikeRow) {
				throw new Crud_Exception("Невозможно добавить сопутствующий товар: `$alike`. Товар с таким именем не найден");
			}
			
			$typePeer = call_user_func(array("Product".ucfirst($type).'Peer', 'getInstance'));
			$select = $typePeer->select();
			$select->where($type . '_id = ?', $alikeRow->getId());
			$select->where('product_id = ?', $row->getId());
			$m2mRow = $typePeer->fetchRow($select);
			if ($m2mRow) {
				throw new Crud_Exception("Невозможно добавить сопутствующий товар: `$alikeRows[0]`. Наименование уже есть в списке");
			}
			
			$nRow = $typePeer->createRow();
			$setter = 'set'.ucfirst($type).'Id';
			$nRow->$setter($alikeRow->getId());
			$nRow->setProductId($row->getId());
			$nRow->save();
		}
	}
	
	protected function _setFinalCatgory($row) {
		$values = $this->_getParam('product2product_category_final', array());

		$catPeer = ProductCategoryPeer::getInstance();
		$finalCats = array();
		foreach ($values as $catId) {
			$catRow = $catPeer->fetchRow(array(ProductCategoryPeer::PARENT_ID .' = ? '=> $catId));
			if (empty($catRow)) {
				$finalCats[] = $catId;
			}
		}
		
		if (!empty($finalCats)) {
			$peer = Product2productCategoryPeer::getInstance();
			$db = Db::getConnection();
			$db->update($peer->getTableName(), array('is_final' => 1), array(
			Product2productCategoryPeer::CATEGORY_ID.' IN (?)' => $finalCats,
			Product2productCategoryPeer::PRODUCT_ID.' = ?' => $row->getId()));
		}
	} 
}
